package com.sxj.corejava.code08_常用类.内部类;

/**
 * @author 石小俊
 * @date 2025年02月18日
 */
public class Test01_成员内部类 {

    public static void main(String[] args) {
        // 在非外部类中实例化内部类
        // 必须先实例化外部类
        Outer outer = new Outer();
        // 通过外部类实例化对应的成员内部类
        // 语法:外部类.内部类 变量名 = 外部类对象.new 内部类()
        Outer.Inner inner = outer.new Inner();
//        outer.show();
//        System.out.println(inner.name);
//        System.out.println(inner.gender);

        inner.show();

    }

}

class Outer {
    private String name = "admin";
    private int age = 18;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        Inner inner = new Inner();
        System.out.println("外部类name:" + name);
        System.out.println("内部类name:" + inner.name);
        System.out.println("gender:" + inner.gender);
    }

    public void test() {
        System.out.println("这是外部类方法");
    }

    // 成员内部类
    class Inner {
        private String name = "alice";
        String gender = "女";

        public void show() {
            // 在内部类中访问外部类的成员,可以直接访问
            System.out.println("age:" + age);
            // 当外部类存在于内部类同名的属性时,使用就近原则,默认访问的是内部类的属性
            // 此时想要访问外部类属性,则可以通过对象访问
            Outer outer = new Outer();
            System.out.println("外部类name:" + outer.name);
            // 也可以通过类名.this.属性访问
            System.out.println("外部类name:" + Outer.this.name);
            System.out.println("内部类name:" + name);
            System.out.println("gender:" + gender);
            test();
            Outer.this.show();
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }
    }
}
